package com.atguigu.juc.day04.cf;

import com.atguigu.juc.day04.pool.Demo01MyPool;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
 * 同步：在同一个线程内执行操作
 * 异步：在不同线程内执行操作
 * 回调：我们声明一个方法，但是交给系统来调用
 */
public class Demo05GetTaskResultAsync {

    public static void main(String[] args) {

        ExecutorService executorService = Demo01MyPool.getExecutorService();

        Supplier<String> supplier = ()->{

            try {
                System.out.println(Thread.currentThread().getName() + " 开始睡觉。");
                TimeUnit.SECONDS.sleep(10);
                System.out.println(Thread.currentThread().getName() + " 结束睡觉。");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            return "task result";
        };

        CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(supplier, executorService);

        // main 线程：调用 whenComplete() 方法
        completableFuture.whenComplete(
                // taskResult：目标任务执行的结果
                // throwable：目标任务抛出的异常
                (String taskResult, Throwable throwable)->{
                    // pool-1-thread-1 线程在目标任务完成后，调用当前方法，这就是异步回调。
                    // 异步：pool-1-thread-1 线程是 main 之外的另一个线程
                    // 回调：当前方法不是我们开发人员自己调用的，而是交给系统调用的
                    System.out.println(Thread.currentThread().getName() + " taskResult = " + taskResult);
                    System.out.println(Thread.currentThread().getName() + " throwable = " + throwable);
        });

        // main 线程：继续执行自己的后续操作，不需要等待目标任务完成
        System.out.println(Thread.currentThread().getName() + " 调用whenComplete()方法后做的打印。");

    }

}
